Repository navigation
Use the current runtime types in source Goal status projection - #8280
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent, gpt-6.1-sol, OpenAI, runtime_reported, max
动机 / Motivation
维护者从主干构建控制平面时,会加载工作区的源 Goal 状态模块。源 Goal 是工作区链接到另一个运行环境中的原始目标,读状态时仍应使用该目标自己的记录。
当前主干在全量类型检查中因一个缺失的类型导出而退出,修复后同一命令通过。工作区状态仍能区分两个同名原始 Goal,并按各自来源读取任务和历史。这次交付限定在修复编译和验证原有来源边界。
改动思路 / Approach
沿用既有 JSON 解码器的对象类型,递归遍历时把未检查的值交给现有分支收窄。工作区服务先从来源读取已注册 Goal 的状态,再交给同一个 TypeScript 投影入口调整本地显示路由。来源注册、查询权限和失败响应仍由原来的读取路径负责。
保留现有解码器和展示投影的分工,可以在原位置修复编译错误。当前范围只调整投影模块的静态类型,保持既有运行时检查和来源数据契约。为不存在的导出补一个递归类型会扩大公共类型边界,此处已有 JsonObject 和运行时收窄足够表达实际输入。
具体改动 / Changes
对照的契约是 docs/development/frontend-delivery.md 在 7108b92337949ddcd6c59f773cc2e0ef10c185c5 的 Native App source Goals 段。该段要求本地视图别名只承担路由,原始 Goal 身份及物理来源继续决定读回。这里分别验证 source-status-original-id 和 source-link-collision-and-absence 两项。前者由同名目标的状态、任务和历史回归用例覆盖,后者由冲突、跨来源访问、来源不可用和恢复用例覆盖。 契约原文
关键代码讲解
projectGoalSourceStatus先检查传入状态只含一个匹配的原始 Goal。内部route的参数和返回标注改为unknown,已有数组和对象分支继续筛选可重写的路由字段。取出投影后的首条历史记录时依然经过对象解码。 状态投影projectGoalSourceLinks使用解码器现有的JsonObject。原有父 Goal、别名和物理命名空间校验仍决定目录中哪些链接可见。没有来源链接时,目录维持本地 Goal 列表。 来源目录投影
对主干的风险 / Risks
需要排除的是递归类型放宽后,原始来源身份、拒绝边界或只读状态被误改。独立比较的编译产物仅有原文件头注释的归属位置变化,去掉注释后 JavaScript 逐字节一致。实际 Chat HTTP 路径在隔离的 SQLite 来源中分别读取同名 Goal,跨命名空间读被拒绝。来源不可用时保留已有链接和其他 Goal 的可读性,恢复后可重新读取。空链接目录的对照也通过。
| 检查 | 结果 |
|---|---|
主干 172d80d630f424b0b44dd513863ba02b5f13d55c 全量控制平面 typecheck |
FAIL,复现 TS2305,缺少 JsonValue 导出 |
| PR head 与主干候选合并树的相同 typecheck | PASS |
| 现有源 Goal HTTP 回归与 Node 投影用例 | PASS,基线和 head 各 14 项 HTTP、8 项 Node |
| 标准 diff premerge | PASS,4 项直接检查和 10 项选定检查,包括双语 RFC 门和公开边界扫描 |
| 远端 CI | UNVERIFIED,按当前评审配置采用本地验证 |
我的整体评价 / Verdict
这次修复恢复了主干开发、验证和集成流程的类型检查。对用户而言,已链接 Goal 的身份、可读性和失败处理由实际读回对照证实保持一致。变更只复用现有本地类型,没有新增状态词汇、运行时开关或权限。该模块的可执行代码相同,评审覆盖源代码和 HTTP 读回,未涉及单独安装后的界面测试。
English verdict: APPROVE 2effc18. The full typecheck is restored. The source Goal tests and comment-free JavaScript comparison confirm runtime parity.
The source Goal status projector introduced in #8278 imports
JsonValuefrom an owner that no longer exports it. The projector now uses the existing JSON decoder types and narrows the recursive input as it walks it. The emitted projection logic is identical.On
7108b92337,npm run typecheck:control-planefails with TS2305. The same command passes with this change, and all 14 linked Goal source tests pass, including isolated workspace views for same-named native Goals.